home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
426-450
/
disk_440
/
3dplot
/
src
/
data2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
13KB
|
542 lines
/*----- PROGRAM INCLUDE FILES -----*/
#include "common.h"
/*-------- DEFINES ----------*/
#define NO_OUTPUT_FILE 1L
#define NO_ICON_FILE 2L
#define NO_INPUT_FILE 3L
#define CkErr(expression) {if (ifferr == IFF_OKAY) ifferr = (expression);}
/*-------- GLOBAL STRUCTURES --------*/
extern struct ILBMBase *ILBMBase;
extern struct IFFBase *IFFBase;
extern struct Window *setwin;
extern struct Gadget EquationD;
extern struct Gadget RotationX;
extern struct Gadget RotationY;
extern struct Gadget RotationZ;
/*------- INTERNAL FUNCTIONS --------*/
AllPlotData *AllocAllPlotData(VOID)
{
return ( AllocMem(sizeof(AllPlotData), MEMF_CLEAR) );
}
VOID FreeAllPlotData(AllPlotData *apd)
{
FreeMem( (void *)apd, sizeof(AllPlotData) );
}
VOID Init3DPL(AllPlotData *pd)
{
pd->dd.RotationX = 45.;
pd->dd.RotationY = -60.;
pd->dd.RotationZ = -135.;
pd->dd.OriginX = 160;
pd->dd.OriginY = 100;
pd->dd.ProjPlane = 0.;
pd->dd.ViewDist = 20.;
pd->dd.Scale = 30.;
pd->dd.LineSpacingX = 0.25;
pd->dd.LineSpacingY = 0.25;
pd->dd.PlotXmin = -3.;
pd->dd.PlotXmax = 3.;
pd->dd.PlotYmin = -3.;
pd->dd.PlotYmax = 3.;
pd->dd.PlotPrecisionX = 0.1;
pd->dd.PlotPrecisionY = 0.1;
pd->ad.AxesXmin = -3.;
pd->ad.AxesXmax = 3.;
pd->ad.AxesYmin = -3.;
pd->ad.AxesYmax = 3.;
pd->ad.AxesZmin = -1.;
pd->ad.AxesZmax = 1.;
pd->ad.AxesPrecision = 0.1;
pd->td.TicX = 1.;
pd->td.TicY = 1.;
pd->td.TicZ = 1.;
pd->td.NumTicX = 1;
pd->td.NumTicY = 1;
pd->td.NumTicZ = 1;
pd->ei.DependVar = 'Z';
strcpy(pd->ei.IndependVar,"XY");
strcpy(&(pd->ei.Equation[0]),"SIN(X*Y)");
pd->pi.Surface = XANDY;
pd->pi.AxesType = AXESTYPENONE;
pd->pi.RotationOrder = ROTATEZYX;
strcpy(pd->nt,"This is a sample note");
} /* Init3DPL */
IFFP Save3DPL(char *filename, AllPlotData *pd)
{
LONG file;
IFFP ifferr = IFF_OKAY;
GroupContext fileContext, formContext;
if (!(file = Open(filename, MODE_NEWFILE))) {
printf("Can't open output file\n");
return (NO_OUTPUT_FILE);
}
Write(file,"x",1); /* 1.1 so Seek to beginning works ? */
#if DEBUG
printf("\nSaving...\n");
#endif
CkErr( OpenWIFF(szNotYetKnown, file, &fileContext) );
CkErr( StartWGroup(FORM,szNotYetKnown,ID_3DPL,&fileContext,&formContext) );
CkErr( PutEQUN(&formContext, &(pd->ei)) );
CkErr( PutDRAW(&formContext, &(pd->dd)) );
CkErr( PutAXES(&formContext, &(pd->ad)) );
CkErr( PutTICS(&formContext, &(pd->td)) );
CkErr( PutTYPE(&formContext, &(pd->pi)) );
CkErr( PutNOTE(&formContext, pd->nt) );
CkErr( EndWGroup(&formContext) );
CkErr( CloseWGroup(&fileContext) );
Close(file);
#if DEBUG
if (ifferr == IFF_OKAY) {
printf("3DPL IFF saved\n");
}
else {
printf("Error on save\n");
}
#endif
return(ifferr);
} /* Save3DPL */
/*
IFFP Read3DPL(char *filename, AllPlotData *pd)
{
LONG file;
IFFP ifferr = IFF_OKAY;
ID CkHdr;
GroupContext fileContext, formContext;
if (!(file = Open(filename, MODE_OLDFILE))) {
printf("Can't open input file\n");
return (NO_INPUT_FILE);
}
#if DEBUG
printf("\nReading...\n");
#endif
CkErr( OpenRIFF(file, &fileContext, NULL) );
CkErr( OpenRGroup(&fileContext,&formContext) );
CkHdr = GetFChunkHdr(&formContext);
while( (CkHdr != END_MARK) && (CkHdr != BAD_IFF) && (ifferr == IFF_OKAY) ) {
switch(CkHdr) {
case ID_EQUN:
ifferr = IFFReadBytes(sizeof(EqInfo),&formContext,&(pd->ei));
break;
case ID_DRAW:
ifferr = IFFReadBytes(sizeof(DrawData),&formContext,&(pd->dd));
break;
case ID_AXES:
ifferr = IFFReadBytes(sizeof(AxesData),&formContext,&(pd->ad));
break;
case ID_TICS:
ifferr = IFFReadBytes(sizeof(TicData),&formContext,&(pd->td));
break;
case ID_TYPE:
ifferr = IFFReadBytes(sizeof(PlotInfo),&formContext,&(pd->pi));
break;
case ID_NOTE:
ifferr = IFFReadBytes(NOTELEN,&formContext,pd->nt);
break;
} /* switch */
CkHdr = GetChunkHdr(&formContext);
} /* while */
CkErr( CloseRGroup(&formContext) );
CkErr( CloseRGroup(&fileContext) );
Close(file);
#if DEBUG
if (ifferr == IFF_OKAY) {
printf("3DPL IFF read\n");
}
else {
printf("Error on read\n");
}
#endif
return(ifferr);
} /* Read3DPL */
*/
LONG Read3DPL(STRPTR filename, AllPlotData *pd)
{
APTR ifffile;
ULONG *chunk;
if( !(ifffile = OldOpenIFF(filename)) ) return IffError();
if( !(chunk = (ULONG *)FindChunk(ifffile, ID_EQUN)) ) goto endread;
memcpy( &(pd->ei), (chunk+2), sizeof(EqInfo) );
if( !(chunk = (ULONG *)FindChunk(ifffile, ID_DRAW)) ) goto endread;
memcpy( &(pd->dd), (chunk+2), sizeof(DrawData) );
if( !(chunk = (ULONG *)FindChunk(ifffile, ID_AXES)) ) goto endread;
memcpy( &(pd->ad), (chunk+2), sizeof(AxesData) );
if( !(chunk = (ULONG *)FindChunk(ifffile, ID_TICS)) ) goto endread;
memcpy( &(pd->td), (chunk+2), sizeof(TicData) );
if( !(chunk = (ULONG *)FindChunk(ifffile, ID_TYPE)) ) goto endread;
memcpy( &(pd->pi), (chunk+2), sizeof(PlotInfo) );
if( !(chunk = (ULONG *)FindChunk(ifffile, ID_NOTE)) ) goto endread;
memcpy( &(pd->nt), (chunk+2), NOTELEN );
endread:
CloseIFF(ifffile);
return IffError();
} /* Read3DPL */
VOID PrintData(AllPlotData *pd)
{
printf("pd->dd.RotationX = %f\n", pd->dd.RotationX);
printf("pd->dd.RotationY = %f\n", pd->dd.RotationY);
printf("pd->dd.RotationZ = %f\n", pd->dd.RotationZ);
printf("pd->dd.OriginX = %d\n", pd->dd.OriginX);
printf("pd->dd.OriginY = %d\n", pd->dd.OriginY);
printf("pd->dd.ProjPlane = %f\n", pd->dd.ProjPlane);
printf("pd->dd.ViewDist = %f\n", pd->dd.ViewDist);
printf("pd->dd.Scale = %f\n", pd->dd.Scale);
printf("pd->dd.LineSpacingX = %f\n", pd->dd.LineSpacingX);
printf("pd->dd.LineSpacingY = %f\n", pd->dd.LineSpacingY);
printf("pd->dd.PlotXmin = %f\n", pd->dd.PlotXmin);
printf("pd->dd.PlotXmax = %f\n", pd->dd.PlotXmax);
printf("pd->dd.PlotYmin = %f\n", pd->dd.PlotYmin);
printf("pd->dd.PlotYmax = %f\n", pd->dd.PlotYmax);
printf("pd->dd.PlotPrecisionX = %f\n", pd->dd.PlotPrecisionX);
printf("pd->dd.PlotPrecisionY = %f\n", pd->dd.PlotPrecisionY);
printf("pd->ad.AxesXmin = %f\n", pd->ad.AxesXmin);
printf("pd->ad.AxesXmax = %f\n", pd->ad.AxesXmax);
printf("pd->ad.AxesYmin = %f\n", pd->ad.AxesYmin);
printf("pd->ad.AxesYmax = %f\n", pd->ad.AxesYmax);
printf("pd->ad.AxesZmin = %f\n", pd->ad.AxesZmin);
printf("pd->ad.AxesZmax = %f\n", pd->ad.AxesZmax);
printf("pd->ad.AxesPrecision = %f\n", pd->ad.AxesPrecision);
printf("pd->td.TicX = %f\n", pd->td.TicX);
printf("pd->td.TicY = %f\n", pd->td.TicY);
printf("pd->td.TicZ = %f\n", pd->td.TicZ);
printf("pd->td.NumTicX = %d\n", pd->td.NumTicX);
printf("pd->td.NumTicY = %d\n", pd->td.NumTicY);
printf("pd->td.NumTicZ = %d\n", pd->td.NumTicZ);
printf("pd->ei.DependVar = %c\n", pd->ei.DependVar);
printf("pd->ei.IndependVar = %s\n", pd->ei.IndependVar);
printf("pd->ei.Equation = %s\n", pd->ei.Equation);
printf("pd->pi.Surface = %d\n", pd->pi.Surface);
printf("pd->pi.AxesType = %d\n", pd->pi.AxesType);
printf("pd->pi.RotationOrder = %d\n", pd->pi.RotationOrder);
printf("pd->nt = %s\n", pd->nt);
} /* PrintData */
VOID SetGadgets(struct Gadget *gadget, AllPlotData *pd)
/* gadget is the Gadget to begin with
pd is the data to insert */
{
struct Gadget *fgadget; /* Copy of first gadget */
STRPTR gtext;
STRPTR string;
LONG *longint;
fgadget = gadget;
while(gadget) { /* loop until no more gadgets */
string = ((struct StringInfo *)(gadget->SpecialInfo))->Buffer;
longint = &(((struct StringInfo *)(gadget->SpecialInfo))->LongInt);
switch(gadget->GadgetID) {
case SURFACE:
gtext = gadget->GadgetText->NextText->IText;
switch(pd->pi.Surface) {
case XONLY:
strcpy(gtext, "X Only ");
break;
case YONLY:
strcpy(gtext, "Y Only ");
break;
case XANDY:
strcpy(gtext, "X and Y");
break;
default:
break;
} /* switch */
break;
case AXESTYPE:
gtext = gadget->GadgetText->NextText->IText;
switch(pd->pi.AxesType) {
case AXESTYPENONE:
strcpy(gtext, "None");
break;
case AXESTYPESTAR:
strcpy(gtext, "Star");
break;
case AXESTYPEBOX:
strcpy(gtext, "Box ");
break;
default:
break;
} /* switch */
break;
case SWAPXYZ:
{ /* begin block */
WORD tempTopEdge[3];
struct Gadget *tempGadget;
/* Obtain three top edges for X, Y, and Z gadgets in order */
tempTopEdge[0] = RotationX.TopEdge;
tempTopEdge[1] = RotationY.TopEdge;
tempTopEdge[2] = RotationZ.TopEdge;
sqsort(&tempTopEdge[0], 3); /* Sort short integers, ascending */
/* Obtain gadget after X, Y, and Z gadgets */
tempGadget = RotationX.NextGadget;
while( (tempGadget == &RotationY) || (tempGadget == &RotationZ) ) {
tempGadget = tempGadget->NextGadget;
}
switch(pd->pi.RotationOrder) {
case ROTATEXYZ:
/* New positions */
RotationX.TopEdge = tempTopEdge[0];
RotationY.TopEdge = tempTopEdge[1];
RotationZ.TopEdge = tempTopEdge[2];
/* Order gadgets in list */
EquationD.NextGadget = &RotationX;
RotationX.NextGadget = &RotationY;
RotationY.NextGadget = &RotationZ;
RotationZ.NextGadget = tempGadget;
break;
case ROTATEXZY:
/* New positions */
RotationX.TopEdge = tempTopEdge[0];
RotationZ.TopEdge = tempTopEdge[1];
RotationY.TopEdge = tempTopEdge[2];
/* Order gadgets in list */
EquationD.NextGadget = &RotationX;
RotationX.NextGadget = &RotationZ;
RotationZ.NextGadget = &RotationY;
RotationY.NextGadget = tempGadget;
break;
case ROTATEYXZ:
/* New positions */
RotationY.TopEdge = tempTopEdge[0];
RotationX.TopEdge = tempTopEdge[1];
RotationZ.TopEdge = tempTopEdge[2];
/* Order gadgets in list */
EquationD.NextGadget = &RotationY;
RotationY.NextGadget = &RotationX;
RotationX.NextGadget = &RotationZ;
RotationZ.NextGadget = tempGadget;
break;
case ROTATEYZX:
/* New positions */
RotationY.TopEdge = tempTopEdge[0];
RotationZ.TopEdge = tempTopEdge[1];
RotationX.TopEdge = tempTopEdge[2];
/* Order gadgets in list */
EquationD.NextGadget = &RotationY;
RotationY.NextGadget = &RotationZ;
RotationZ.NextGadget = &RotationX;
RotationX.NextGadget = tempGadget;
break;
case ROTATEZXY:
/* New positions */
RotationZ.TopEdge = tempTopEdge[0];
RotationX.TopEdge = tempTopEdge[1];
RotationY.TopEdge = tempTopEdge[2];
/* Order gadgets in list */
EquationD.NextGadget = &RotationZ;
RotationZ.NextGadget = &RotationX;
RotationX.NextGadget = &RotationY;
RotationY.NextGadget = tempGadget;
break;
case ROTATEZYX:
/* New positions */
RotationZ.TopEdge = tempTopEdge[0];
RotationY.TopEdge = tempTopEdge[1];
RotationX.TopEdge = tempTopEdge[2];
/* Order gadgets in list */
EquationD.NextGadget = &RotationZ;
RotationZ.NextGadget = &RotationY;
RotationY.NextGadget = &RotationX;
RotationX.NextGadget = tempGadget;
break;
default:
break;
} /* switch */
} /* end block */
break;
case ROTATIONX:
*longint = (LONG)(pd->dd.RotationX);
sprintf(string, "%d", *longint);
break;
case ROTATIONY:
*longint = (LONG)(pd->dd.RotationY);
sprintf(string, "%d", *longint);
break;
case ROTATIONZ:
*longint = (LONG)(pd->dd.RotationZ);
sprintf(string, "%d", *longint);
break;
case ORIGINX:
*longint = pd->dd.OriginX;
sprintf(string, "%d", *longint);
break;
case ORIGINY:
*longint = pd->dd.OriginY;
sprintf(string, "%d", *longint);
break;
case SIZINGPROJPLANE:
gcvt(pd->dd.ProjPlane, 10, string);
break;
case SIZINGVIEWDIST:
gcvt(pd->dd.ViewDist, 10, string);
break;
case SIZINGSCALE:
gcvt(pd->dd.Scale, 10, string);
break;
case LINESPACINGX:
gcvt(pd->dd.LineSpacingX, 10, string);
break;
case LINESPACINGY:
gcvt(pd->dd.LineSpacingY, 10, string);
break;
case PLOTSPANXMIN:
gcvt(pd->dd.PlotXmin, 10, string);
break;
case PLOTSPANXMAX:
gcvt(pd->dd.PlotXmax, 10, string);
break;
case PLOTSPANYMIN:
gcvt(pd->dd.PlotYmin, 10, string);
break;
case PLOTSPANYMAX:
gcvt(pd->dd.PlotYmax, 10, string);
break;
case PLOTPRECISIONX:
gcvt(pd->dd.PlotPrecisionX, 10, string);
break;
case PLOTPRECISIONY:
gcvt(pd->dd.PlotPrecisionY, 10, string);
break;
case AXESSPANXMIN:
gcvt(pd->ad.AxesXmin, 10, string);
break;
case AXESSPANXMAX:
gcvt(pd->ad.AxesXmax, 10, string);
break;
case AXESSPANYMIN:
gcvt(pd->ad.AxesYmin, 10, string);
break;
case AXESSPANYMAX:
gcvt(pd->ad.AxesYmax, 10, string);
break;
case AXESSPANZMIN:
gcvt(pd->ad.AxesZmin, 10, string);
break;
case AXESSPANZMAX:
gcvt(pd->ad.AxesZmax, 10, string);
break;
case AXESPRECISION:
gcvt(pd->ad.AxesPrecision, 10, string);
break;
case EQUATIONZ:
strcpy(string, pd->ei.Equation);
break;
case SETTINGSNOTE:
strcpy(string, pd->nt);
break;
} /* switch */
gadget = gadget->NextGadget;
} /* while */
RefreshGadgets(fgadget, setwin, NULL);
} /* SetGadgets */